#ifndef HEAP_TIMER
#define HEAP_TIMER
//小根堆 计时器
//使用 std::vector 为基础序列
//使用 堆排序算法对序列操作
//使用 std::chrono::high_resolution_clock 为时钟
//high_resolution_clock 可以是system_clock、stedy_clock(单调时钟)
//时间单位为 毫秒 ms
#include <chrono>
#include <functional>
#include <unordered_map>
#include <vector>
#include <assert.h>
typedef std::function<void()> TimeCallBack;
typedef std::chrono::high_resolution_clock Clock;
typedef Clock::time_point TimePoint;
typedef std::chrono::milliseconds MS;
struct TimerNode
{
    int id;                     //fd？
    TimeCallBack cb;            //超时将要执行的回调函数
    TimePoint expires;          

    bool operator<(const TimerNode& rtime)
    {
        return (expires < rtime.expires);
    }
    bool operator>(const TimerNode& rtime)
    {
        return (expires > rtime.expires);
    }
    TimerNode(int id_,TimeCallBack cb_,TimePoint expires_)
        :id(id_),
        cb(cb_),
        expires(expires_)
    {
    
    }        
};
class HeapTime
{
public:
    HeapTime(){ Heap_.reserve(64);  }
    ~HeapTime(){    clear();    }

    void add(int id,int timeout,const TimeCallBack& cb);    //增加一个时间结点
    void adjust(int i,int newExpires);                      //调整一个时间结点
    void doWork(int id);                                          //触发一个结点的回调函数并删除
    void tick();                                            //开始超时检测
    //根据首结点(大根堆堆顶？)调整下一次的检测时间 //重新设置心跳
    int GetNetTick();

    void clear();                                           
    void pop();                                             


private:
    void sifup_(size_t i);                  //2个堆排序算法   
    bool sifdown_(size_t i,size_t j);

    void del_(size_t i);
    void swap_node(size_t i,size_t j);

    std::vector<TimerNode> Heap_;
    //key:id , value: index of Heap_ Heap_下标
    std::unordered_map<int,size_t> ref_;
};
#endif